﻿// -----------------------------------------------------------------------
// <copyright file="Product.cs" company="Spardo, LLC">
// Copyright (c) 2011 SPardo, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a 
// copy of this software and associated documentation files (the "Software"), 
// to deal in the Software without restriction, including without limitation 
// the rights to use, copy, modify, merge, publish, distribute, sublicense, 
// and/or sell copies of the Software, and to permit persons to whom the 
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included 
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.
// </copyright>
// -----------------------------------------------------------------------

namespace BBYOpen.Linq.Models
{
    using System.Runtime.Serialization;
    using System;

    [DataContract(Name = "products")]
    public class Product : IRemixItem
    {
        #region Product Reference Information

        [DataMember(Name = "active")]
        public bool? Active { get; set; }

        [DataMember(Name = "activeUpdateDate")]
        protected string ActiveUpdateDateString { get; set; }

        [IgnoreDataMember]
        public DateTime? ActiveUpdateDate
        {
            get { return this.ActiveUpdateDateString.ConvertToDate(); }
            set { this.ActiveUpdateDateString = value.ConvertToDateString(); }
        }

        [DataMember(Name = "bestBuyItemId")]
        public long BestBuyItemId { get; set; }

        // TODO: bundledIn.sku

        [DataMember(Name = "categoryPath")]
        public Categories CategoryPath { get; set; }

        [DataMember(Name = "class")]
        public string Class { get; set; }

        [DataMember(Name = "classId")]
        public int? ClassId { get; set; }

        [DataMember(Name = "department")]
        public string Department { get; set; }

        [DataMember(Name = "departmentId")]
        public int? DepartmentId { get; set; }

        [DataMember(Name = "itemUpdateDate")]
        protected string ItemUpdateDateString { get; set; }

        [IgnoreDataMember]
        public DateTime? ItemUpdateDate
        {
            get { return this.ItemUpdateDateString.ConvertToDate(); }
            set { this.ItemUpdateDateString = value.ConvertToDateString(); }
        }

        // TODO: members.sku

        [DataMember(Name = "modelNumber")]
        public string ModelNumber { get; set; }

        [DataMember(Name = "name")]
        public string Name { get; set; }

        [DataMember(Name = "new")]
        public bool? New { get; set; }

        [DataMember(Name = "productId")]
        public long? ProductId { get; set; }

        [DataMember(Name = "salesRankLongTerm")]
        public int? SalesRankLongTerm { get; set; }

        [DataMember(Name = "salesRankMediumTerm")]
        public int? SalesRankMediumTerm { get; set; }

        [DataMember(Name = "salesRankShortTerm")]
        public int? SalesRankShortTerm { get; set; }

        [DataMember(Name = "sku")]
        public long? Sku { get; set; }

        [DataMember(Name = "source")]
        public string Source { get; set; }

        [DataMember(Name = "startDate")]
        protected string StartDateString { get; set; }

        [IgnoreDataMember]
        public DateTime? StartDate
        {
            get { return this.StartDateString.ConvertToDate(); }
            set { this.StartDateString = value.ConvertToDateString(); }
        }

        [DataMember(Name = "subclass")]
        public string Subclass { get; set; }

        [DataMember(Name = "subclassId")]
        public int? SubclassId { get; set; }

        [DataMember(Name = "type")]
        public string Type { get; set; }

        [DataMember(Name = "upc")]
        public string Upc { get; set; }

        #endregion Product Reference Information

        #region Product Information

        // TODO: accessories.sku

        [DataMember(Name = "color")]
        public string Color { get; set; }

        [DataMember(Name = "condition")]
        public string Condition { get; set; }

        [DataMember(Name = "customerReviewAverage")]
        public double? CustomerReviewAverage { get; set; }

        [DataMember(Name = "customerReviewCount")]
        public int? CustomerReviewCount { get; set; }

        [DataMember(Name = "depth")]
        public string Depth { get; set; }

        [DataMember(Name = "description")]
        public string Description { get; set; }

        // TODO: details.name

        // TODO: details.value

        [DataMember(Name = "height")]
        public string Height { get; set; }
        
        [DataMember(Name = "digital")]
        public bool? Digital { get; set; }

        // TODO: features.feature

        // TODO: frequentlyPurchasedWith.sku

        [DataMember(Name = "format")]
        public string Format { get; set; }

        // TODO: includedItemList.includedItem

        [DataMember(Name = "longDescription")]
        public string LongDescription { get; set; }

        [DataMember(Name = "longDescriptionHtml")]
        public string LongDescriptionHtml { get; set; }

        [DataMember(Name = "manufacturer")]
        public string Manufacturer { get; set; }

        [DataMember(Name = "preowned")]
        public bool? Preowned { get; set; }

        [DataMember(Name = "quantityLimit")]
        public int? QuantityLimit { get; set; }

        // TODO: relatedProducts.sku

        [DataMember(Name = "releaseDate")]
        protected string ReleaseDateString { get; set; }

        [IgnoreDataMember]
        public DateTime? ReleaseDate
        {
            get { return this.ReleaseDateString.ConvertToDate(); }
            set { this.ReleaseDateString = value.ConvertToDateString(); }
        }

        [DataMember(Name = "shortDescription")]
        public string ShortDescription { get; set; }

        [DataMember(Name = "shortDescriptionHtml")]
        public string ShortDescriptionHtml { get; set; }

        [DataMember(Name = "warrantyLabor")]
        public string WarrantyLabor { get; set; }

        [DataMember(Name = "warrantyParts")]
        public string WarrantyParts { get; set; }

        [DataMember(Name = "weight")]
        public string Weight { get; set; }

        [DataMember(Name = "width")]
        public string Width { get; set; }

        #endregion Product Information

        #region Price

        [DataMember(Name = "dollarSavings")]
        public double? DollarSavings { get; set; }

        // TODO: offers.id

        // TODO: offers.text

        // TODO: offers.url

        [DataMember(Name = "onSale")]
        public bool? OnSale { get; set; }

        [DataMember(Name = "priceUpdateDate")]
        protected string PriceUpdateDateString { get; set; }

        [IgnoreDataMember]
        public DateTime? PriceUpdateDate
        {
            get { return this.PriceUpdateDateString.ConvertToDate(); }
            set { this.PriceUpdateDateString = value.ConvertToDateString(); }
        }

        [DataMember(Name = "regularPrice")]
        public double? RegularPrice { get; set; }

        [DataMember(Name = "salePrice")]
        public double? SalePrice { get; set; }

        #endregion Price

        #region Delivery (including Availability and Shipping)

        [DataMember(Name = "freeShipping")]
        public bool? FreeShipping { get; set; }

        [DataMember(Name = "friendsAndFamilyPickup")]
        public bool? FriendsAndFamilyPickup { get; set; }

        [DataMember(Name = "homeDelivery")]
        public bool? HomeDelivery { get; set; }

        [DataMember(Name = "inStoreAvailability")]
        public bool? InStoreAvailability { get; set; }

        [DataMember(Name = "inStoreAvailabilityText")]
        public string InStoreAvailabilityText { get; set; }

        [DataMember(Name = "inStoreAvailabilityTextHtml")]
        public string InStoreAvailabilityTextHtml { get; set; }

        [DataMember(Name = "inStoreAvailabilityUpdateDate")]
        protected string InStoreAvailabilityUpdateDateString { get; set; }

        [IgnoreDataMember]
        public DateTime? InStoreAvailabilityUpdateDate
        {
            get { return this.InStoreAvailabilityUpdateDateString.ConvertToDate(); }
            set { this.InStoreAvailabilityUpdateDateString = value.ConvertToDateString(); }
        }

        [DataMember(Name = "inStorePickup")]
        public bool? InStorePickup { get; set; }

        [DataMember(Name = "onlineAvailability")]
        public bool? OnlineAvailability { get; set; }

        [DataMember(Name = "onlineAvailabilityText")]
        public string OnlineAvailabilityText { get; set; }

        [DataMember(Name = "onlineAvailabilityTextHtml")]
        public string OnlineAvailabilityTextHtml { get; set; }

        [DataMember(Name = "onlineAvailabilityUpdateDate")]
        public string OnlineAvailabilityUpdateDate { get; set; }

        [DataMember(Name = "orderable")]
        public string Orderable { get; set; }

        // TODO: shipping.ground

        // TODO: shipping.nextDay

        // TODO: shipping.secondDay

        // TODO: shipping.vendorDelivery

        [DataMember(Name = "shippingCost")]
        public double? ShippingCost { get; set; }

        [DataMember(Name = "shippingWeight")]
        public string ShippingWeight { get; set; }

        [DataMember(Name = "specialOrder")]
        public bool? SpecialOrder { get; set; }
        
        #endregion Delivery (including Availability and Shipping)

        #region Images
        
        [DataMember(Name = "accessoriesImage")]
        public string AccessoriesImage { get; set; }

        [DataMember(Name = "alternateViewsImage")]
        public string AlternateViewsImage { get; set; }

        [DataMember(Name = "angleImage")]
        public string AngleImage { get; set; }

        [DataMember(Name = "backViewImage")]
        public string BackViewImage { get; set; }

        [DataMember(Name = "energyGuideImage")]
        public string EnergyGuideImage { get; set; }

        [DataMember(Name = "image")]
        public string Image { get; set; }

        [DataMember(Name = "largeFrontImage")]
        public string LargeFrontImage { get; set; }

        [DataMember(Name = "largeImage")]
        public string LargeImage { get; set; }

        [DataMember(Name = "leftViewImage")]
        public string LeftViewImage { get; set; }

        [DataMember(Name = "mediumImage")]
        public string MediumImage { get; set; }

        [DataMember(Name = "remoteControlImage")]
        public string RemoteControlImage { get; set; }

        [DataMember(Name = "rightViewImage")]
        public string RightViewImage { get; set; }

        [DataMember(Name = "spin360Url")]
        public string Spin360Url { get; set; }

        [DataMember(Name = "thumbnailImage")]
        public string ThumbnailImage { get; set; }

        [DataMember(Name = "topViewImage")]
        public string TopViewImage { get; set; }

        #endregion Images

        #region Links

        [DataMember(Name = "addToCartUrl")]
        public string AddToCartUrl { get; set; }

        [DataMember(Name = "cjAffiliateAddToCartUrl")]
        public string cjAffiliateAddToCartUrl { get; set; }

        [DataMember(Name = "cjAffiliateUrl")]
        public string cjAffiliateUrl { get; set; }

        [DataMember(Name = "mobileUrl")]
        public string MobileUrl { get; set; }

        [DataMember(Name = "tinyMobileUrl")]
        public string TinyMobileUrl { get; set; }

        [DataMember(Name = "url")]
        public string BBYUrl { get; set; }
        
        #endregion Links

        #region Plans

        // TODO: buybackPlans.name

        // TODO: buybackPlans.sku

        // TODO: buybackPlans.type

        [DataMember(Name = "planPrice")]
        public double? PlanPrice { get; set; }

        // TODO: protectionPlanDetails.termsAndConditions

        [DataMember(Name = "protectionPlanHighPrice")]
        public double? ProtectionPlanHighPrice { get; set; }

        [DataMember(Name = "protectionPlanLowPrice")]
        public double? ProtectionPlanLowPrice { get; set; }

        // TODO: protectionPlans.sku

        // TODO: protectionPlans.term

        // TODO: protectionPlans.type

        [DataMember(Name = "protectionPlanTerm")]
        public string ProtectionPlanTerm { get; set; }

        [DataMember(Name = "protectionPlanType")]
        public string ProtectionPlanType { get; set; }

        #endregion Plans

        #region Music

        [DataMember(Name = "albumTitle")]
        public string AlbumTitle { get; set; }

        [DataMember(Name = "artistId")]
        public string ArtistId { get; set; }

        [DataMember(Name = "artistName")]
        public string ArtistName { get; set; }

        [DataMember(Name = "copyright")]
        public string Copyright { get; set; }

        [DataMember(Name = "napsterAlbumId")]
        public string NapsterAlbumId { get; set; }

        [DataMember(Name = "originalReleaseDate")]
        protected string OriginalReleaseDateString { get; set; }

        [IgnoreDataMember]
        public DateTime? OriginalReleaseDate
        {
            get { return this.OriginalReleaseDateString.ConvertToDate(); }
            set { this.OriginalReleaseDateString = value.ConvertToDateString(); }
        }

        [DataMember(Name = "parentalAdvisory")]
        public bool? ParentalAdvisory { get; set; }

        // Not Documented

        [DataMember(Name = "genre")]
        public string Genre { get; set; }

        [DataMember(Name = "albumLabel")]
        public string AlbumLabel { get; set; }

        [DataMember(Name = "albumVersion")]
        public string AlbumVersion { get; set; }

        #endregion Music

        #region Movies

        [DataMember(Name = "aspectRatio")]
        public string AspectRatio { get; set; }

        [DataMember(Name = "cast")]
        public MoviePeople Cast { get; set; }

        [DataMember(Name = "crew")]
        public MoviePeople Crew { get; set; }
        
        [DataMember(Name = "lengthInMinutes")]
        public int? LengthInMinutes { get; set; }

        [DataMember(Name = "mpaaRating")]
        public string MpaaRating { get; set; }

        [DataMember(Name = "plot")]
        public string Plot { get; set; }

        [DataMember(Name = "plotHtml")]
        public string PlotHtml { get; set; }

        [DataMember(Name = "studio")]
        public string Studio { get; set; }

        [DataMember(Name = "theatricalReleaseDate")]
        public string TheatricalReleaseDate { get; set; }

        #endregion Movies

        #region Games and Software

        [DataMember(Name = "esrbRating")]
        public string EsrbRating { get; set; }

        [DataMember(Name = "platform")]
        public string Platform { get; set; }

        [DataMember(Name = "softwareAge")]
        public string SoftwareAge { get; set; }

        [DataMember(Name = "softwareGrade")]
        public string SoftwareGrade { get; set; }

        [DataMember(Name = "softwareMultiplayerInternet")]
        public string SoftwareMultiplayerInternet { get; set; }

        [DataMember(Name = "softwareNumberOfPlayers")]
        public string SoftwareNumberOfPlayers { get; set; }

        [DataMember(Name = "softwareOnlinePlay")]
        public string SoftwareOnlinePlay { get; set; }

        [DataMember(Name = "softwareReleaseDate")]
        protected string SoftwareReleaseDateString { get; set; }

        [IgnoreDataMember]
        public DateTime? SoftwareReleaseDate
        {
            get { return this.SoftwareReleaseDateString.ConvertToDate(); }
            set { this.SoftwareReleaseDateString = value.ConvertToDateString(); }
        }

        [DataMember(Name = "tradeInValue")]
        public string TradeInValue { get; set; }

        #endregion

        #region Computers, Office

        [DataMember(Name = "batteryLifeMin")]
        public int? BatteryLifeMin { get; set; }

        [DataMember(Name = "bluetoothEnabled")]
        public bool? BluetoothEnabled { get; set; }

        [DataMember(Name = "bluRayPlayer")]
        public bool? BluRayPlayer { get; set; }

        [DataMember(Name = "displayType")]
        public string DisplayType { get; set; }

        [DataMember(Name = "driveCapacityGb")]
        public int? DriveCapacityGb { get; set; }

        [DataMember(Name = "driveConnectivity")]
        public string DriveConnectivity { get; set; }

        [DataMember(Name = "lcdScreenSizeIn")]
        public double? LcdScreenSizeIn { get; set; }

        [DataMember(Name = "scannerType")]
        public string ScannerType { get; set; }
        
        #endregion Computers, Office

        #region Audio, Video, Home Theater

        [DataMember(Name = "analogAudioInputs")]
        public int? AnalogAudioInputs { get; set; }

        [DataMember(Name = "audioOutputs")]
        public int? AudioOutputs { get; set; }

        [DataMember(Name = "avOutputs")]
        public int? AvOutputs { get; set; }

        [DataMember(Name = "bdLive")]
        public bool? BdLive { get; set; }

        [DataMember(Name = "brightnessLumens")]
        public int? BrightnessLumens { get; set; }

        [DataMember(Name = "builtForBluRay")]
        public bool? BuiltForBluRay { get; set; }

        [DataMember(Name = "builtInPlayer")]
        public string BuiltInPlayer { get; set; }

        [DataMember(Name = "cdRRwCompatible")]
        public bool? CdRRwCompatible { get; set; }

        [DataMember(Name = "channelLabeling")]
        public bool? ChannelLabeling { get; set; }

        [DataMember(Name = "clock")]
        public bool? Clock { get; set; }

        [DataMember(Name = "coaxialDigitalAudioOutputs")]
        public bool? CoaxialDigitalAudioOutputs { get; set; }

        [DataMember(Name = "combFilter")]
        public string CombFilter { get; set; }

        [DataMember(Name = "componentVideoInputs")]
        public int? ComponentVideoInputs { get; set; }

        [DataMember(Name = "componentVideoOutputs")]
        public int? ComponentVideoOutputs { get; set; }

        [DataMember(Name = "compositeVideoInputs")]
        public int? CompositeVideoInputs { get; set; }

        [DataMember(Name = "compositeVideoOutputs")]
        public int? CompositeVideoOutputs { get; set; }

        [DataMember(Name = "contrastRatio")]
        public string ContrastRatio { get; set; }

        [DataMember(Name = "depthWithoutStandIn")]
        public double? DepthWithoutStandIn { get; set; }

        [DataMember(Name = "depthWithStandIn")]
        public double? DepthWithStandIn { get; set; }

        [DataMember(Name = "digitalAudioInputs")]
        public string DigitalAudioInputs { get; set; }

        [DataMember(Name = "digitalAudioOutputs")]
        public string DigitalAudioOutputs { get; set; }

        [DataMember(Name = "digitalOutputs")]
        public int? DigitalOutputs { get; set; }

        [DataMember(Name = "digitalTuner")]
        public bool? DigitalTuner { get; set; }

        [DataMember(Name = "discCapacity")]
        public int? DiscCapacity { get; set; }

        [DataMember(Name = "dolbyDigitalDecoder")]
        public bool? DolbyDigitalDecoder { get; set; }

        [DataMember(Name = "dvdPlayer")]
        public bool? DvdPlayer { get; set; }

        [DataMember(Name = "dviInputs")]
        public int? DviInputs { get; set; }

        [DataMember(Name = "dviOutputs")]
        public int? DviOutputs { get; set; }

        [DataMember(Name = "dynamicContrastRatio")]
        public string DynamicContrastRatio { get; set; }

        [DataMember(Name = "ethernetPort")]
        public bool? EthernetPort { get; set; }

        [DataMember(Name = "fiveOneChannelInput")]
        public bool? FiveOneChannelInput { get; set; }

        [DataMember(Name = "fiveOneChannelOutput")]
        public bool? FiveOneChannelOutput { get; set; }

        [DataMember(Name = "frontPanelAvInputs")]
        public int? FrontPanelAvInputs { get; set; }

        [DataMember(Name = "frontSurroundPowerPerChannel")]
        public string FrontSurroundPowerPerChannel { get; set; }

        [DataMember(Name = "hdmiInputs")]
        public int? HdmiInputs { get; set; }

        [DataMember(Name = "hdmiOutputs")]
        public int? HdmiOutputs { get; set; }

        [DataMember(Name = "hdRadioCompatible")]
        public bool? HdRadioCompatible { get; set; }

        [DataMember(Name = "hdRadioReady")]
        public bool? HdRadioReady { get; set; }

        [DataMember(Name = "hdtvCompatibility")]
        public bool? HdtvCompatibility { get; set; }

        [DataMember(Name = "headphoneJacks")]
        public bool? HeadphoneJacks { get; set; }

        [DataMember(Name = "heightWithoutStandIn")]
        public double? HeightWithoutStandIn { get; set; }

        [DataMember(Name = "heightWithStandIn")]
        public double? HeightWithStandIn { get; set; }

        [DataMember(Name = "ieee1394FirewirePort")]
        public bool? Ieee1394FirewirePort { get; set; }

        // TODO: instantContent.provider

        [DataMember(Name = "internetConnectable")]
        public bool? InternetConnectable { get; set; }

        [DataMember(Name = "iphoneAccessory")]
        public bool? IphoneAccessory { get; set; }

        [DataMember(Name = "ipodConnection")]
        public bool? IpodConnection { get; set; }

        [DataMember(Name = "ipodDock")]
        public bool? IpodDock { get; set; }

        [DataMember(Name = "ipodReady")]
        public bool? IpodReady { get; set; }

        // TODO: languageOptions.language

        [DataMember(Name = "maximumOutputResolution")]
        public string MaximumOutputResolution { get; set; }

        [DataMember(Name = "maximumPowerHandling")]
        public int? MaximumPowerHandling { get; set; }

        [DataMember(Name = "maximumResolutionHorizontalPx")]
        public int? MaximumResolutionHorizontalPx { get; set; }

        [DataMember(Name = "maximumResolutionVerticalPx")]
        public int? MaximumResolutionVerticalPx { get; set; }

        [DataMember(Name = "mediaCardSlot")]
        public bool? MediaCardSlot { get; set; }

        [DataMember(Name = "mediaPort")]
        public bool? MediaPort { get; set; }

        [DataMember(Name = "mountBracketVesaPattern")]
        public string MountBracketVesaPattern { get; set; }

        [DataMember(Name = "mp3PlaybackCapability")]
        public bool? Mp3PlaybackCapability { get; set; }

        [DataMember(Name = "multiroomCapability")]
        public bool? MultiroomCapability { get; set; }

        [DataMember(Name = "numberOfChannels")]
        public double? NumberOfChannels { get; set; }

        [DataMember(Name = "numberOfSpeakers")]
        public double? NumberOfSpeakers { get; set; }

        [DataMember(Name = "onScreenDisplay")]
        public bool? OnScreenDisplay { get; set; }

        [DataMember(Name = "opticalDigitalAudioOutputs")]
        public bool? OpticalDigitalAudioOutputs { get; set; }

        [DataMember(Name = "pcInputs")]
        public int? PcInputs { get; set; }

        [DataMember(Name = "peakPowerHandling")]
        public int? PeakPowerHandling { get; set; }

        [DataMember(Name = "phonoInputs")]
        public bool? PhonoInputs { get; set; }

        [DataMember(Name = "pictureInPicture")]
        public bool? PictureInPicture { get; set; }

        // TODO: playbackFormats.format

        [DataMember(Name = "playerType")]
        public string PlayerType { get; set; }

        [DataMember(Name = "preampOutputs")]
        public bool? PreampOutputs { get; set; }

        [DataMember(Name = "productAspectRatio")]
        public string ProductAspectRatio { get; set; }

        [DataMember(Name = "rearSurroundPowerPerChannel")]
        public string RearSurroundPowerPerChannel { get; set; }

        [DataMember(Name = "remoteControlType")]
        public string RemoteControlType { get; set; }

        [DataMember(Name = "reversibleDoorHinge")]
        public bool? ReversibleDoorHinge { get; set; }

        [DataMember(Name = "rfAntennaInputs")]
        public int? RfAntennaInputs { get; set; }

        [DataMember(Name = "satelliteRadioReady")]
        public bool? SatelliteRadioReady { get; set; }

        [DataMember(Name = "screenRefreshRateHz")]
        public int? ScreenRefreshRateHz { get; set; }

        [DataMember(Name = "screenSizeClassIn")]
        public int? ScreenSizeClassIn { get; set; }

        [DataMember(Name = "screenSizeIn")]
        public double? ScreenSizeIn { get; set; }

        [DataMember(Name = "sdCardSlot")]
        public bool? SdCardSlot { get; set; }

        [DataMember(Name = "shelfSystemType")]
        public string ShelfSystemType { get; set; }

        [DataMember(Name = "simulatedSurround")]
        public bool? SimulatedSurround { get; set; }

        [DataMember(Name = "sixOneChannelInput")]
        public bool? SixOneChannelInput { get; set; }

        [DataMember(Name = "sleepTimer")]
        public bool? SleepTimer { get; set; }

        [DataMember(Name = "soundLeveler")]
        public bool? SoundLeveler { get; set; }

        [DataMember(Name = "soundType")]
        public string SoundType { get; set; }

        [DataMember(Name = "speakerAbSwitching")]
        public bool? SpeakerAbSwitching { get; set; }

        [DataMember(Name = "speakerLocation")]
        public string SpeakerLocation { get; set; }

        [DataMember(Name = "stationPresets")]
        public int? StationPresets { get; set; }

        [DataMember(Name = "subwooferPowerWatts")]
        public int? SubwooferPowerWatts { get; set; }

        [DataMember(Name = "subwooferSizeIn")]
        public double? SubwooferSizeIn { get; set; }

        [DataMember(Name = "surroundSoundDecoders")]
        public string SurroundSoundDecoders { get; set; }

        [DataMember(Name = "sVideoInputs")]
        public int? SVideoInputs { get; set; }

        [DataMember(Name = "sVideoOutputs")]
        public int? SVideoOutputs { get; set; }

        [DataMember(Name = "threeDPassThrough")]
        public bool? ThreeDPassThrough { get; set; }

        [DataMember(Name = "threeDReady")]
        public bool? ThreeDReady { get; set; }

        [DataMember(Name = "totalHarmonicDistortion")]
        public string TotalHarmonicDistortion { get; set; }

        [DataMember(Name = "totalReceiverPower")]
        public int? TotalReceiverPower { get; set; }

        [DataMember(Name = "totalSystemPowerWatts")]
        public int? TotalSystemPowerWatts { get; set; }

        [DataMember(Name = "tvType")]
        public string TvType { get; set; }

        [DataMember(Name = "usbInput")]
        public bool? UsbInput { get; set; }

        [DataMember(Name = "usbOutput")]
        public bool? UsbOutput { get; set; }

        [DataMember(Name = "usbPort")]
        public bool? UsbPort { get; set; }

        [DataMember(Name = "vChip")]
        public bool? VChip { get; set; }

        [DataMember(Name = "verticalResolution")]
        public string VerticalResolution { get; set; }

        [DataMember(Name = "videoUpConversion")]
        public bool? VideoUpConversion { get; set; }

        [DataMember(Name = "wattsPerChannel")]
        public int? WattsPerChannel { get; set; }

        [DataMember(Name = "wifiBuiltIn")]
        public bool? WifiBuiltIn { get; set; }

        [DataMember(Name = "wifiReady")]
        public bool? WifiReady { get; set; }

        [DataMember(Name = "wirelessSubwoofer")]
        public bool? WirelessSubwoofer { get; set; }

        #endregion Audio, Video, Home Theater

        #region Appliances

        [DataMember(Name = "cabinetSideColor")]
        public string CabinetSideColor { get; set; }

        [DataMember(Name = "capacityCuFt")]
        public double? CapacityCuFt { get; set; }

        [DataMember(Name = "childLock")]
        public bool? ChildLock { get; set; }

        [DataMember(Name = "controlType")]
        public string ControlType { get; set; }

        [DataMember(Name = "energyConsumptionKwhPerYear")]
        public int? EnergyConsumptionKwhPerYear { get; set; }

        [DataMember(Name = "energyStarQualified")]
        public bool? EnergyStarQualified { get; set; }

        // TODO: estimatedYearlyOperatingCosts.estimatedYearlyOperatingCost

        [DataMember(Name = "interiorLight")]
        public bool? InteriorLight { get; set; }

        [DataMember(Name = "sabbathMode")]
        public bool? SabbathMode { get; set; }

        #endregion Appliances

        #region Refrigerators

        [DataMember(Name = "capacityFreezerCuFt")]
        public double? CapacityFreezerCuFt { get; set; }

        [DataMember(Name = "capacityFreshFoodCuFt")]
        public double? CapacityFreshFoodCuFt { get; set; }

        [DataMember(Name = "counterDepth")]
        public bool? CounterDepth { get; set; }

        [DataMember(Name = "depthIncludingHandlesIn")]
        public double? DepthIncludingHandlesIn { get; set; }

        [DataMember(Name = "depthLessDoorIn")]
        public double? DepthLessDoorIn { get; set; }

        [DataMember(Name = "depthWithDoorOpenIn")]
        public double? DepthWithDoorOpenIn { get; set; }

        [DataMember(Name = "depthWithoutHandlesIn")]
        public double? DepthWithoutHandlesIn { get; set; }

        [DataMember(Name = "dispenserColor")]
        public string DispenserColor { get; set; }

        [DataMember(Name = "doorHandleColor")]
        public string DoorHandleColor { get; set; }

        [DataMember(Name = "doorOpenAlarm")]
        public bool? DoorOpenAlarm { get; set; }

        [DataMember(Name = "factoryInstalledIceMaker")]
        public bool? FactoryInstalledIceMaker { get; set; }

        [DataMember(Name = "gallonDoorStorage")]
        public bool? GallonDoorStorage { get; set; }

        [DataMember(Name = "heightToTopOfDoorHingeIn")]
        public double? HeightToTopOfDoorHingeIn { get; set; }

        [DataMember(Name = "heightToTopOfRefrigeratorIn")]
        public double? HeightToTopOfRefrigeratorIn { get; set; }

        [DataMember(Name = "humidityControlledCrisper")]
        public bool? HumidityControlledCrisper { get; set; }

        [DataMember(Name = "shelfConstruction")]
        public string ShelfConstruction { get; set; }

        [DataMember(Name = "style")]
        public string Style { get; set; }

        [DataMember(Name = "surfaceFinish")]
        public string SurfaceFinish { get; set; }

        [DataMember(Name = "temperatureControlType")]
        public string TemperatureControlType { get; set; }

        [DataMember(Name = "thruTheDoorIceDispenser")]
        public bool? ThruTheDoorIceDispenser { get; set; }

        [DataMember(Name = "thruTheDoorWaterDispenser")]
        public bool? ThruTheDoorWaterDispenser { get; set; }

        [DataMember(Name = "waterFilterLocation")]
        public string WaterFilterLocation { get; set; }

        [DataMember(Name = "waterFiltration")]
        public bool? WaterFiltration { get; set; }

        [DataMember(Name = "waterFiltrationReplacementIndicatorLight")]
        public bool? WaterFiltrationReplacementIndicatorLight { get; set; }

        #endregion Refrigerators

        #region Washers and Dryers

        [DataMember(Name = "agitatorType")]
        public string AgitatorType { get; set; }

        [DataMember(Name = "automaticTemperatureControl")]
        public bool? AutomaticTemperatureControl { get; set; }

        [DataMember(Name = "bleachDispenser")]
        public bool? BleachDispenser { get; set; }

        [DataMember(Name = "compactDesign")]
        public bool? CompactDesign { get; set; }

        [DataMember(Name = "customSettings")]
        public bool? CustomSettings { get; set; }

        // TODO: cycleDescriptions.cycleDescription

        [DataMember(Name = "delayedStart")]
        public bool? DelayedStart { get; set; }

        [DataMember(Name = "delicateCycle")]
        public bool? DelicateCycle { get; set; }

        [DataMember(Name = "drumAndInteriorFinish")]
        public string DrumAndInteriorFinish { get; set; }

        [DataMember(Name = "dryingRack")]
        public bool? DryingRack { get; set; }

        [DataMember(Name = "endOfCycleSignal")]
        public bool? EndOfCycleSignal { get; set; }

        [DataMember(Name = "extraDelicateCycle")]
        public bool? ExtraDelicateCycle { get; set; }

        [DataMember(Name = "fabricDispenser")]
        public bool? FabricDispenser { get; set; }

        [DataMember(Name = "handWashCycle")]
        public bool? HandWashCycle { get; set; }

        [DataMember(Name = "highEfficiency")]
        public bool? HighEfficiency { get; set; }

        [DataMember(Name = "ledButtons")]
        public bool? LedButtons { get; set; }

        [DataMember(Name = "lintFilterLight")]
        public bool? LintFilterLight { get; set; }

        [DataMember(Name = "loadAccess")]
        public string LoadAccess { get; set; }

        [DataMember(Name = "moistureSensor")]
        public bool? MoistureSensor { get; set; }

        [DataMember(Name = "noiseReduction")]
        public bool? NoiseReduction { get; set; }

        [DataMember(Name = "numberOfCycles")]
        public int? NumberOfCycles { get; set; }

        [DataMember(Name = "numberOfWashCycles")]
        public int? NumberOfWashCycles { get; set; }

        [DataMember(Name = "permanentPressCycle")]
        public bool? PermanentPressCycle { get; set; }

        [DataMember(Name = "powerSource")]
        public string PowerSource { get; set; }

        [DataMember(Name = "powerSourceRatings")]
        public string PowerSourceRatings { get; set; }

        [DataMember(Name = "preWashDispenser")]
        public bool? PreWashDispenser { get; set; }

        [DataMember(Name = "sanitationAllergyCycle")]
        public bool? SanitationAllergyCycle { get; set; }

        [DataMember(Name = "secondRinse")]
        public bool? SecondRinse { get; set; }

        [DataMember(Name = "stackable")]
        public bool? Stackable { get; set; }

        [DataMember(Name = "steam")]
        public bool? Steam { get; set; }

        [DataMember(Name = "touchPadControls")]
        public bool? TouchPadControls { get; set; }

        [DataMember(Name = "vibrationReduction")]
        public bool? VibrationReduction { get; set; }

        [DataMember(Name = "waterEfficiency")]
        public bool? WaterEfficiency { get; set; }
        
        #endregion Washers and Dryers

        #region Undocumented

        [DataMember(Name = "affiliateAddToCartUrl")]
        public string AffiliateAddToCartUrl { get; set; }

        [DataMember(Name = "skuSourceIndicator")]
        public string SkuSourceIndicator { get; set; }

        [DataMember(Name = "affiliateUrl")]
        public string AffiliateUrl { get; set; }

        [DataMember(Name = "outletCenter")]
        public string OutletCenter { get; set; }

        [DataMember(Name = "nationalFeatured")]
        public string NationalFeatured { get; set; }

        [DataMember(Name = "sellerId")]
        public string SellerId { get; set; }

        [DataMember(Name = "marketplace")]
        public bool? Marketplace { get; set; }

        [DataMember(Name = "secondaryMarket")]
        public string SecondaryMarket { get; set; }

        [DataMember(Name = "listingId")]
        public string ListingId { get; set; }

        [DataMember(Name = "printOnly")]
        public bool? PrintOnly { get; set; }

        #endregion Undocumented
    }
}
